home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 4.0 KB | 222 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // BlitPixieMaskCollision - pixel-precise collision detection
- //
- // written by Anders F Björklund <afb@algonet.se>
- // ©1999 afb.
- ///--------------------------------------------------------------------------------------
-
- #ifndef __BLITPIXIE__
- #include "BlitPixieHeader.h"
- #endif
-
- #include "BlitPixieAsm.h"
-
- // NOTE: assumes bytes, rows > 0
-
- #pragma mark *** PowerPC asm :
- #if USE_PPC_ASSEMBLY
-
- ASM_FUNC Boolean BlitPixieMaskCollision(
- register unsigned char *maskPtr1, // r3
- register unsigned char *maskPtr2, // r4
- register unsigned long rowBytes1, // r5
- register unsigned long rowBytes2, // r6
- register unsigned short bytes, // r7
- register unsigned short rows) // r8
- {
- #define r_maskPtr1 r3
- #define r_maskPtr2 r4
- #define r_rowBytes1 r5
- #define r_rowBytes2 r6
- #define r_bytes r7
- #define r_rows r8
-
- #define r_dochar r7
- #define r_words r9
- #define r_doshort r10
- #define r_temp1 r11
- #define r_temp2 r12
-
- ASM_BEGIN
-
- sub r_rowBytes1,r_rowBytes1,r_bytes
- sub r_rowBytes2,r_rowBytes2,r_bytes
-
- rlwinm r_words,r_bytes,30,2,31
- rlwinm r_doshort,r_bytes,31,31,31
- rlwinm r_dochar,r_bytes,0,31,31
-
- subi r3,r3,4
- subi r4,r4,4
-
- cmplwi cr5,r_words,0
- cmplwi cr6,r_doshort,0
- cmplwi cr7,r_dochar,0
-
- @yloop:
-
- beq cr5,@skipwords
- mtctr r_words
- @wordloop:
- lwzu r_temp1,4(r3)
- lwzu r_temp2,4(r4)
- nor. r_temp1,r_temp1,r_temp2
- bne @collision
- bdnz @wordloop
- @skipwords:
-
- beq cr6,@skipshort
- lhz r_temp1,4(r3)
- lhz r_temp2,4(r4)
- addi r3,r3,2
- or r_temp1,r_temp1,r_temp2
- cmplwi r_temp1,0xFFFF
- addi r4,r4,2
- bne @collision
- @skipshort:
-
- beq cr7,@skipbyte
- lbz r_temp1,4(r3)
- lbz r_temp2,4(r4)
- addi r3,r3,1
- or. r_temp1,r_temp1,r_temp2
- addi r4,r4,1
- beq @collision
- @skipbyte:
-
- subic. r_rows,r_rows,1
-
- add r3,r3,r_rowBytes1
- add r4,r4,r_rowBytes2
-
- bne @yloop
-
- li r3,0
- blr
-
- @collision:
- li r3,1
-
- ASM_END
- }
-
- #pragma mark *** 680x0 asm :
- #elif USE_68K_ASSEMBLY
-
- ASM_FUNC Boolean BlitPixieMaskCollision(
- unsigned char *maskPtr1,
- unsigned char *maskPtr2,
- unsigned long rowBytesOffset1,
- unsigned long rowBytesOffset2,
- unsigned short bytesPerRow,
- unsigned short rows)
- {
- #define D_rowBytes1 D2
- #define D_rowBytes2 D3
- #define D_bytes D4
- #define D_y D5
-
- #define D_words D6
- #define D_doshort D7
-
- ASM_BEGIN
-
- MOVEM.L D3-D7/A2,-(SP) // D0-D2,A0-A1 are volatile
-
- MOVEM.L maskPtr1,A0/A1
- // MOVE.L maskPtr1,A0
- // MOVE.L maskPtr2,A1
- MOVEM.L rowBytesOffset1,D2-D3
- // MOVE.L rowBytes1,rowBytes1
- // MOVE.L rowBytes2,rowBytes2
- MOVEM.W bytesPerRow,D4-D5
- // MOVE.W bytesPerRow,bytes
- // MOVE.W rows,y
-
- SUB.L D_bytes,D_rowBytes1
- SUB.L D_bytes,D_rowBytes2
-
- MOVE.W D_bytes,D_words
- LSR.W #2,D_words
- MOVE.W D_bytes,D_doshort
- ANDI.W #2,D_doshort
- ANDI.W #1,D_bytes
-
- @yloop:
-
- MOVE.W D_words,D1
- BEQ.S @skipwords
- @wordloop:
- MOVE.L (A0)+,D0
- OR.L (A1)+,D0
- NOT.L D0
- BNE.S @collision
- SUBQ.W #1,D1
- BNE.S @wordloop
- @skipwords:
-
- TST.W D_doshort
- BEQ.S @skipshort
- MOVE.W (A0)+,D0
- OR.W (A1)+,D0
- NOT.W D0
- BNE.S @collision
- @skipshort:
-
- TST.W D_bytes
- BEQ.S @skipbyte
- MOVE.B (A0)+,D0
- OR.B (A1)+,D0
- BEQ.S @collision
- @skipbyte:
-
- ADDA.L D_rowBytes1,A0
- ADDA.L D_rowBytes2,A1
-
- SUBQ.W #1,D_y
- BNE.S @yloop
-
- MOVEQ #0,D0
- BRA.S @done
-
- @collision:
- MOVEQ #1,D0
-
- @done:
- MOVEM.L (SP)+,D3-D7/A2
- ASM_END
- }
-
- #pragma mark *** Generic C :
- #elif USE_GENERIC_C
-
- Boolean BlitPixieMaskCollision(
- unsigned char *maskPtr1,
- unsigned char *maskPtr2,
- unsigned long rowBytes1,
- unsigned long rowBytes2,
- unsigned short bytes,
- unsigned short rows)
- {
- unsigned long x;
-
- rowBytes1 -= bytes;
- rowBytes2 -= bytes;
-
- while ( rows-- )
- {
- for ( x = 0; x < bytes; x++)
- {
- if ( (*maskPtr1++ | *maskPtr2++) == 0 )
- return true;
- }
-
- maskPtr1 += rowBytes1;
- maskPtr2 += rowBytes2;
- }
-
- return false;
- }
-
- #endif // GENERATING…
-